package com.ipartek.formacion.whoiswho.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.ipartek.formacion.whoiswho.bean.Empleado;

public class EmpleadoMySqlDAO implements IEmpleadoDAO {
    private Connection conexion = null;

    @Override
    public synchronized ArrayList<Empleado> getAll() {
	ArrayList<Empleado> empleados = null;
	Statement st = null;
	ResultSet rs = null;

	try {
	    conexion = MySqlDAOFactory.getInstance().conectar();

	    empleados = new ArrayList<Empleado>();
	    st = conexion.createStatement();
	    rs = st.executeQuery("CONSULTA");
	    Empleado e = null;
	    while (rs.next()) {
		// TODO Insertar empleados
	    }

	} catch (Exception e) {
	    e.printStackTrace();

	} finally { // cerrar todos los objetos creados para el acceso de BBDD
	    // cerrar ResultSet
	    if (rs != null) {
		try {
		    rs.close();
		} catch (Exception e2) {
		    e2.printStackTrace();
		}
	    }
	    // cerrar statements
	    if (st != null) {
		try {
		    st.close();
		} catch (Exception e2) {
		    e2.printStackTrace();
		}
	    }
	    MySqlDAOFactory.getInstance().desconectar();

	}

	return empleados;

    }

    @Override
    public synchronized Empleado getById(Empleado emp) {
	Empleado empleado = null;
	PreparedStatement st = null;
	ResultSet rs = null;

	try {
	    conexion = MySqlDAOFactory.getInstance().conectar();

	    st = conexion.prepareStatement("CONSULTA");
	    // TODO Preparar la consulta
	    // st.setInt(1, p.getId());

	    rs = st.executeQuery();

	    // TODO
	    /*
	     * pers = new Persona(rs.getInt(IPersonaDAO.COL_ID),
	     * rs.getString(IPersonaDAO.COL_NOMBRE),
	     * rs.getString(IPersonaDAO.COL_APELLIDOS),
	     * rs.getInt(IPersonaDAO.COL_EDAD),
	     * rs.getString(IPersonaDAO.COL_FOTO));
	     */

	} catch (Exception e) {
	    // cerrar conexion

	    e.printStackTrace();

	} finally { // cerrar todos los objetos creados para el acceso de BBDD
	    // cerrar ResultSet
	    if (rs != null) {
		try {
		    rs.close();
		} catch (Exception e2) {
		    e2.printStackTrace();
		}
	    }
	    // cerrar statements
	    if (st != null) {
		try {
		    st.close();
		} catch (Exception e2) {
		    e2.printStackTrace();
		}
	    }
	    MySqlDAOFactory.getInstance().desconectar();

	}

	return emp;
    }

    @Override
    public synchronized int insert(Empleado emp) {
	int idNuevo = -1;
	PreparedStatement st = null;
	ResultSet rs = null;
	try {
	    conexion = MySqlDAOFactory.getInstance().conectar();
	    st = conexion.prepareStatement("CONSULTA",
		    Statement.RETURN_GENERATED_KEYS);

	    // TODO preparar consulta
	    // st.setString(1, emp.getNombre());

	    int affectedRows = st.executeUpdate();
	    if (affectedRows == 0) {
		throw new SQLException(
			"Creating user failed, no rows affected.");
	    }

	    try (ResultSet generatedKeys = st.getGeneratedKeys()) {
		if (generatedKeys.next()) {
		    idNuevo = generatedKeys.getInt(1);
		} else {
		    throw new SQLException(
			    "Creating user failed, no ID obtained.");
		}
	    }

	} catch (Exception e) {

	    e.printStackTrace();

	} finally { // cerrar todos los objetos creados para el acceso de BBDD
	    // cerrar ResultSet
	    if (rs != null) {
		try {
		    rs.close();
		} catch (Exception e2) {
		    e2.printStackTrace();
		}
	    }
	    // cerrar statements
	    if (st != null) {
		try {
		    st.close();
		} catch (Exception e2) {
		    e2.printStackTrace();
		}
	    }
	    MySqlDAOFactory.getInstance().desconectar();

	}

	return idNuevo;
    }

    @Override
    public synchronized boolean delete(Empleado emp) {
	boolean correcto = false;

	PreparedStatement st = null;
	ResultSet rs = null;
	try {
	    conexion = MySqlDAOFactory.getInstance().conectar();

	    st = conexion.prepareStatement("CONSULTA");
	    // TODO preparar consulta
	    // st.setInt(1, emp.getId());

	    st.executeUpdate();
	    correcto = true;

	} catch (Exception e) {

	    e.printStackTrace();

	} finally { // cerrar todos los objetos creados para el acceso de BBDD
	    // cerrar ResultSet
	    if (rs != null) {
		try {
		    rs.close();
		} catch (Exception e2) {
		    e2.printStackTrace();
		}
	    }
	    // cerrar statements
	    if (st != null) {
		try {
		    st.close();
		} catch (Exception e2) {
		    e2.printStackTrace();
		}
	    }
	    MySqlDAOFactory.getInstance().desconectar();

	}

	return correcto;
    }

    @Override
    public synchronized boolean update(Empleado emp) {
	boolean correcto = false;
	PreparedStatement st = null;
	ResultSet rs = null;
	try {
	    conexion = MySqlDAOFactory.getInstance().conectar();

	    st = conexion.prepareStatement("CONSULTA");
	    // TODO Preparar consulta
	    // st.setString(1, emp.getNombre());

	    st.executeUpdate();
	    correcto = true;

	} catch (Exception e) {
	    // cerrar conexion

	    e.printStackTrace();

	} finally { // cerrar todos los objetos creados para el acceso de BBDD
	    // cerrar ResultSet
	    if (rs != null) {
		try {
		    rs.close();
		} catch (Exception e2) {
		    e2.printStackTrace();
		}
	    }
	    // cerrar statements
	    if (st != null) {
		try {
		    st.close();
		} catch (Exception e2) {
		    e2.printStackTrace();
		}
	    }
	    MySqlDAOFactory.getInstance().desconectar();

	}

	return correcto;
    }

}
